"""
质量评估代理 - 负责评估内容正确性和代码可运行性
"""
from typing import Dict, Any, List
from .base_agent import BaseAgent
from .utils import extract_json_from_text, validate_python_syntax
import logging

logger = logging.getLogger(__name__)

class QualityAgent(BaseAgent):
    """质量评估代理 - 负责评估内容正确性和代码可运行性"""
    
    def __init__(self):
        super().__init__()
        self.name = "quality"
        logger.info("QualityAgent 初始化完成")
    
    def execute(self, state: Dict[str, Any]) -> Dict[str, Any]:
        """
        执行质量评估
        
        Args:
            state: 当前状态，包含生成的内容等信息
            
        Returns:
            Dict[str, Any]: 评估结果
        """
        try:
            logger.info("开始执行质量评估...")
            logger.info(f"收到的状态数据: {state}")
            
            # 检查必需的字段
            if "content" not in state:
                error_msg = "状态中缺少 content 字段"
                logger.error(error_msg)
                return {"success": False, "error": error_msg, "status": "failed"}
            
            content = state["content"]
            
            # 提取代码块
            code_blocks = self._extract_code_blocks(content)
            
            # 验证代码语法
            code_issues = self.validate_code_syntax(code_blocks)
            
            # 生成质量评估提示词
            prompt = self._create_quality_prompt(content, code_blocks)
            
            # 调用LLM进行评估
            logger.info("调用LLM进行质量评估...")
            result = self.call_llm([
                {"role": "system", "content": "你是一个技术内容质量评估专家。"},
                {"role": "user", "content": prompt}
            ])
            
            if not result["success"]:
                logger.error(f"LLM调用失败: {result.get('error')}")
                return {
                    "success": False,
                    "error": result["error"],
                    "status": "failed"
                }
            
            # 解析评估结果
            evaluation_data = extract_json_from_text(result["content"])
            if not evaluation_data:
                error_msg = "无法解析评估结果"
                logger.error(error_msg)
                return {
                    "success": False,
                    "error": error_msg,
                    "status": "failed"
                }
            
            # 添加代码问题到评估结果
            evaluation_data["code_issues"] = code_issues
            
            logger.info(f"质量评估完成，总分: {evaluation_data.get('overall_score', 0)}")
            return {
                "success": True,
                "content": result["content"],
                "evaluation": evaluation_data,
                "status": "completed"
            }
            
        except Exception as e:
            error_msg = f"质量评估执行失败: {str(e)}"
            logger.error(error_msg)
            logger.error(f"错误详情: {traceback.format_exc()}")
            return {
                "success": False,
                "error": error_msg,
                "status": "failed"
            }

    def _create_quality_prompt(self, content: str, code_blocks: List[str]) -> str:
        """创建质量评估提示词"""
        # 先构建代码块字符串
        code_blocks_str = ""
        for code in code_blocks:
            code_blocks_str += f"```python\n{code}\n```\n"

        # 使用普通字符串格式化
        return f"""
请评估以下技术内容的质量：

内容：
{content}

代码块：
{code_blocks_str}

请从以下维度进行评估（1-10分）并返回JSON格式结果：
1. 内容准确性：技术信息是否正确
2. 逻辑清晰度：结构是否清晰，逻辑是否合理
3. 实用性：是否有实际应用价值
4. 代码质量：代码是否可运行，是否有语法错误
5. 完整性：内容是否完整，是否遗漏重要信息

必须返回如下JSON格式：
{{
    "accuracy_score": 8,
    "clarity_score": 9,
    "practicality_score": 7,
    "code_quality_score": 8,
    "completeness_score": 8,
    "overall_score": 8.0,
    "feedback": [
        "具体的改进建议1",
        "具体的改进建议2"
    ]
}}"""

    def validate_code_syntax(self, code_blocks: List[str]) -> List[str]:
        """验证代码语法"""
        issues = []
        for i, code in enumerate(code_blocks):
            if not validate_python_syntax(code):
                issues.append(f"代码块 {i+1} 存在语法错误")
        return issues
    
    def _extract_code_blocks(self, content: str) -> List[str]:
        """从内容中提取代码块"""
        import re
        pattern = r"```python\n(.*?)\n```"
        matches = re.finditer(pattern, content, re.DOTALL)
        return [match.group(1).strip() for match in matches] 